package com.wgh.product.api.client;

import com.wgh.product.api.fallback.ProductClientFallback;
import com.wgh.common.vo.PageResult;
import com.wgh.common.vo.Result;
import com.wgh.product.dto.ProductDTO;
import com.wgh.product.dto.SkuDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Map;

/**
 * 商品服务完整客户端接口
 * 对应ProductController中的所有API
 */
@FeignClient(name = "shop-product", fallback = ProductClientFallback.class)
public interface ProductClient {

    /**
     * 分页查询商品列表
     */
    @GetMapping("/product/page")
    Result<PageResult<ProductDTO>> getProductPage(
            @RequestParam Map<String, Object> params,
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize);

    /**
     * 获取商品详情
     */
    @GetMapping("/product/{id}")
    Result<ProductDTO> getProductDetail(@PathVariable Long id);

    /**
     * 新增商品
     */
    @PostMapping("/product")
    Result<Boolean> addProduct(@RequestBody ProductDTO productDTO);

    /**
     * 更新商品
     */
    @PutMapping("/product")
    Result<Boolean> updateProduct(@RequestBody ProductDTO productDTO);

    /**
     * 批量更新商品状态
     */
    @PutMapping("/product/status/batch")
    Result<Boolean> updateStatusBatch(@RequestParam List<Long> ids, @RequestParam Integer status);

    /**
     * 批量更新商品价格
     */
    @PutMapping("/product/price/batch")
    Result<Boolean> updatePriceBatch(@RequestParam List<Long> ids, @RequestParam Double price);

    /**
     * 批量更新商品库存
     */
    @PutMapping("/product/stock/batch")
    Result<Boolean> updateStockBatch(@RequestParam List<Long> ids, @RequestParam Integer stock);

    /**
     * 搜索商品
     */
    @GetMapping("/product/search")
    Result<PageResult<ProductDTO>> searchProducts(
            @RequestParam String keyword,
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize);

    /**
     * 更新商品收藏量
     */
    @PutMapping("/product/{id}/favorite")
    Result<Boolean> updateFavoriteCount(@PathVariable Long id, @RequestParam Integer increment);

    /**
     * 删除商品（逻辑删除）
     */
    @DeleteMapping("/product/{id}")
    Result<Boolean> deleteProduct(@PathVariable Long id);

    /**
     * 根据分类ID获取商品数量
     */
    @GetMapping("/product/count/category/{categoryId}")
    Result<Integer> countByCategoryId(@PathVariable Long categoryId);

    /**
     * 根据品牌ID获取商品数量
     */
    @GetMapping("/product/count/brand/{brandId}")
    Result<Integer> countByBrandId(@PathVariable Long brandId);

    /**
     * 根据ID列表批量获取商品信息
     */
    @GetMapping("/product/list")
    Result<List<ProductDTO>> getProductListByIds(@RequestParam List<Long> ids);

    /**
     * 根据分类ID获取商品列表
     */
    @GetMapping("/product/category/{categoryId}")
    Result<List<ProductDTO>> getProductsByCategoryId(
            @PathVariable Long categoryId,
            @RequestParam(required = false) Integer pageNum,
            @RequestParam(required = false) Integer pageSize);
}